package com.snack.common.page;

import java.sql.SQLException;
import java.util.Map;

/**
 * 获取ListPage对象的工厂类。
 * 
 * <p>
 * Copyright: Copyright (c) Feb 6, 2009 3:39:21 PM
 * <p>
 * Company: 北京宽连十方数字技术有限公司
 * <p>
 * Author: chengyao
 * <p>
 * Version: 1.0
 * <p>
 */
public class PageFactory {

    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs
     */
    public static ListPage<String[]> getArrayPage(String sql) throws SQLException {
        return getArrayPage(sql, 1, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, int curPage) throws SQLException {
        return getArrayPage(sql, curPage, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, int curPage, int pageSize) throws SQLException {
        return getArrayPage(sql, curPage, pageSize, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, Object param) throws SQLException {
        return getArrayPage(sql, 1, Page.DEFAULT_PAGESIZE, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, Object param, int curPage) throws SQLException {
        return getArrayPage(sql, curPage, Page.DEFAULT_PAGESIZE, param);
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, int curPage, int pageSize, Object param) throws SQLException {
        return getArrayPage(sql, curPage, pageSize, new Object[] { param });
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, Object[] params) throws SQLException {
        return getArrayPage(sql, 1, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, int curPage, Object... params) throws SQLException {
        return getArrayPage(sql, curPage, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回数组格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<String[]> getArrayPage(String sql, int curPage, int pageSize, Object... params) throws SQLException {
        ListPagedStatement<String[]> pst = new ListPagedStatement<String[]>(sql, curPage, pageSize, params);
        return pst.executeQuery(0);
    }
    
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql) throws SQLException {
        return getPage(sql, 1, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage) throws SQLException {
        return getPage(sql, curPage, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage, int pageSize) throws SQLException {
        return getPage(sql, curPage, pageSize, (Object[]) null);
    }    
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, Object param) throws SQLException {
        return getPage(sql, 1, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage, Object param) throws SQLException {
        return getPage(sql, curPage, Page.DEFAULT_PAGESIZE, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage, int pageSize, Object param) throws SQLException {
        return getPage(sql, curPage, pageSize, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, Object... params) throws SQLException {
        return getPage(sql, 1, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage, Object... params) throws SQLException {
        return getPage(sql, curPage, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为对象格式。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, Object>> getPage(String sql, int curPage, int pageSize, Object... params) throws SQLException {
        ListPagedStatement<Map<String, Object>> pst = new ListPagedStatement<Map<String, Object>>(sql, curPage, pageSize, params);
        return pst.executeQuery(2);
    }
    
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param clazz     可以转化的bean类
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz) throws SQLException {
        return getPage(sql, clazz, 1, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
      * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage) throws SQLException {
        return getPage(sql, clazz, curPage, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage, int pageSize) throws SQLException {
        return getPage(sql, clazz, curPage, pageSize, (Object[]) null);
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param clazz     可以转化的bean类
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, Object param) throws SQLException {
        return getPage(sql, clazz, 1, Page.DEFAULT_PAGESIZE, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage, Object param) throws SQLException {
        return getPage(sql, clazz, curPage, Page.DEFAULT_PAGESIZE, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage, int pageSize, Object param) throws SQLException {
        return getPage(sql, clazz, curPage, pageSize, new Object[] { param });
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param clazz     可以转化的bean类
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, Object... params) throws SQLException {
        return getPage(sql, clazz, 1, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage, Object... params) throws SQLException {
        return getPage(sql, clazz, curPage, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Bean格式的分页对象。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param clazz     可以转化的bean类
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static <T> ListPage<T> getPage(String sql, Class<T> clazz, int curPage, int pageSize, Object... params) throws SQLException {
        ListPagedStatement<T> pst = new ListPagedStatement<T>(sql, curPage, pageSize, params);
        pst.setClazz(clazz);
        return pst.executeQuery(-1);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql) throws SQLException {
        return getMapPage(sql, 1, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage) throws SQLException {
        return getMapPage(sql, curPage, Page.DEFAULT_PAGESIZE, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage, int pageSize) throws SQLException {
        return getMapPage(sql, curPage, pageSize, (Object[]) null);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, Object param) throws SQLException {
        return getMapPage(sql, 1, Page.DEFAULT_PAGESIZE, param);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage, Object param) throws SQLException {
        return getMapPage(sql, curPage, Page.DEFAULT_PAGESIZE, param);
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param param     查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage, int pageSize, Object param) throws SQLException {
        return getMapPage(sql, curPage, pageSize, new Object[] { param });
    }

    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, Object... params) throws SQLException {
        return getMapPage(sql, 1, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage, Object... params) throws SQLException {
        return getMapPage(sql, curPage, Page.DEFAULT_PAGESIZE, params);
    }
    
    /**
     * 根据传入的数据库相关的sql和页面信息返回Map格式的分页对象，Map的值为字符串。
     * @param sql       用于查询记录集的SQL
     * @param params    查询参数
     * @param curPage   显示的页数
     * @param pageSize  每页记录数
     * @return          基于数据库相关的sql的分页实现类
     * @throws SQLException  if a database access error occurs 
     */
    public static ListPage<Map<String, String>> getMapPage(String sql, int curPage, int pageSize, Object... params) throws SQLException {
        ListPagedStatement<Map<String, String>> pst = new ListPagedStatement<Map<String, String>>(sql, curPage, pageSize, params);
        return pst.executeQuery(1);
    }
}